#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>

#define READ_MEMERY 64

//int main()
//{
//  /*--------创建匿名管道-------*/
//  int pipefd[2] = {0};
//  if(pipe(pipefd) != 0)
//  {
//    perror("pipe faild");
//    exit(1);
//  }
//  // printf("pipefd[0] = %d\n", pipefd[0]); //3->读
//  // printf("pipefd[1] = %d\n", pipefd[1]); //4->写
//  /*-------------父进程读，子进程写-----------*/ 
//  if(fork() == 0)
//  {
//    // child
//    // 关闭读通道
//    close(pipefd[0]);
//    const char* msg = "sherry_lei";
//    while(1)
//    {
//      /*-- 当写的快，读的慢时：pipe只要有缓冲区，就一直往里面按字节写入--*/ 
//       write(pipefd[1], msg, strlen(msg));
//       sleep(1);
//    }
//    exit(1);
//  }
//  // parent
//  // 关闭写通道
//  close(pipefd[1]);
//  while(1)
//  {
//    sleep(1);
//    char buff[READ_MEMERY] = {0};
//    ssize_t s = read(pipefd[0], buff, sizeof(buff) - 1);
//    // 如果read的返回值是0，意味子进程没有再写了，并且关闭文件描述符
//    if(s > 0)
//    {
//      buff[s] = 0;
//      printf("child say to parent -> %s\n", buff);
//    }
//    else if(s == 0)
//    {
//      printf("child writer quit..\n");
//      break;
//    }
//    else
//    {
//      printf("read error\n");
//      break;  
//    }
//  }
//
//  return 0;
//}

/*--------------计算管道的大小->4kb----------*/
//int main()
//{
//  /*--------创建匿名管道-------*/
//  int pipefd[2] = {0};
//  if(pipe(pipefd) != 0)
//  {
//    perror("pipe faild");
//    exit(1);
//  }
//  /*-------------父进程读，子进程写-----------*/ 
//  if(fork() == 0)
//  {
//    // child
//    // 关闭读通道
//    close(pipefd[0]);
//    int count = 0;
//    while(1)
//    {
//      /*--计算pipe空间大小--*/
//      write(pipefd[1], "c", 1);
//      count++;
//      printf("count->%d\n",count);
//    }
//    exit(1);
//  }
//  // parent
//  // 关闭写通道
//  close(pipefd[1]);
//  while(1)
//  {
//  }
//  return 0;
//}

/*-------------------写端写入5次后，写端退出----------------------*/
//int main()
//{
//  /*--------创建匿名管道-------*/
//  int pipefd[2] = {0};
//  if(pipe(pipefd) != 0)
//  {
//    perror("pipe faild");
//    exit(1);
//  }
//  // printf("pipefd[0] = %d\n", pipefd[0]); //3->读
//  // printf("pipefd[1] = %d\n", pipefd[1]); //4->写
//  /*-------------父进程读，子进程写-----------*/ 
//  if(fork() == 0)
//  {
//    // child
//    // 关闭读通道
//    close(pipefd[0]);
//    const char* msg = "sherry_lei";
//    int cnt = 5;
//    while(cnt--)
//    {
//       write(pipefd[1], msg, strlen(msg));
//       sleep(1);
//    }
//    /*--当写完之后，关闭子进程的写端--*/
//    close(pipefd[1]);
//    exit(1);
//  }
//  // parent
//  // 关闭写通道
//  close(pipefd[1]);
//  while(1)
//  {
//    char buff[READ_MEMERY] = {0};
//    ssize_t s = read(pipefd[0], buff, sizeof(buff) - 1);
//    // 如果read的返回值是0，意味子进程没有再写了，并且关闭文件描述符
//    if(s > 0)
//    {
//      buff[s] = 0;
//      printf("child say to parent -> %s\n", buff);
//    }
//    else if(s == 0)
//    {
//      printf("child writer quit..\n");
//      break;
//    }
//    else
//    {
//      printf("read error\n");
//      break;  
//    }
//  }
//  return 0;
//}


/*-------------------写端一直写，读端读10次后退出----------------------*/
int main()
{
  /*--------创建匿名管道-------*/
  int pipefd[2] = {0};
  if(pipe(pipefd) != 0)
  {
    perror("pipe faild");
    exit(1);
  }
  // printf("pipefd[0] = %d\n", pipefd[0]); //3->读
  // printf("pipefd[1] = %d\n", pipefd[1]); //4->写
  /*-------------父进程读，子进程写-----------*/ 
  if(fork() == 0)
  {
    // child
    // 关闭读通道
    close(pipefd[0]);
    const char* msg = "sherry_lei";
    while(1)
    {
       write(pipefd[1], msg, strlen(msg));
       sleep(1);
    }
    exit(1);
  }
  // parent
  // 关闭写通道
  close(pipefd[1]);
  int cnt = 10;
  while(cnt--)
  {
    sleep(1);
    char buff[READ_MEMERY] = {0};
    ssize_t s = read(pipefd[0], buff, sizeof(buff) - 1);
    // 如果read的返回值是0，意味子进程没有再写了，并且关闭文件描述符
    if(s > 0)
    {
      buff[s] = 0;
      printf("child say to parent -> %s\n", buff);
    }
    else if(s == 0)
    {
      printf("child writer quit..\n");
      break;
    }
    else
    {
      printf("read error\n");
      break;  
    }
  }
  close(pipefd[0]);
  sleep(5);
  int status = 0;
  waitpid(-1, &status, 0);
  printf("wait_code:%d exit_signal:%d\n", (status>>8)&0xFF, status & 0x7F);
  return 0;
}


/*-------------------课后作业-----------------*/
//int main()
//{
//  /*--------创建匿名管道-------*/
//  int pipefd[2] = {0};
//  if(pipe(pipefd) != 0)
//  {
//    perror("pipe faild");
//    exit(1);
//  }
//  /*-------------父进程读，子进程写-----------*/ 
//  if(fork() == 0)
//  {
//    // child
//    close(pipefd[1]);
//    while(1)
//    {
//      char buff[READ_MEMERY] = {0};
//      ssize_t s = read(pipefd[0], buff, sizeof(buff) - 1);
//      if(s > 0)
//      {
//        buff[s] = 0;
//        printf("parent say to child -> %s\n", buff);
//      }
//      else if(s == 0)
//      {
//        printf("parent writer quit..\n");
//        break;
//      }
//      else
//      {
//        printf("read error\n");
//        break;  
//      }
//    }
//    exit(1);
//  }
//  // parent
//  close(pipefd[0]);
//  const char* msg = "sherry_lei";
//  while(1)
//  {
//    write(pipefd[1], msg, strlen(msg));
//    sleep(1);
//  }
//  return 0;
//}


